//[
//  E_2ViewController.m
//  RACExamale
//
//  Created by cym_bj on 2017/12/1.
//  Copyright © 2017年 com.cym. All rights reserved.
//

#import "E_2ViewController.h"
#import <ReactiveObjC/ReactiveObjC.h>
@interface E_2ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *accountTF;
@property (weak, nonatomic) IBOutlet UITextField *pwdTF;
@property (weak, nonatomic) IBOutlet UIButton *loginBtn;

@end

@implementation E_2ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.title=@"组合";
   
    //判断按钮是否可点击
    //[self loginBtnEnable];
    
    //所有请求完成才执行
    //[self zipWith];
    
    //任意一个信号请求完成都会订阅到
    //[self merge];
    
    //then 忽略掉第一个信号所有值
   // [self then];
    
    //按顺序去连接
    [self concat];
    
    
    
}

#pragma mark - 按钮是否可点击
-(void)loginBtnEnable
{
    
    //判断按钮是否可点击
    
    //reduceBlock参数:根组合的信号有关,一一对应
    RACSignal *cominesignal=[RACSignal combineLatest: @[self.accountTF.rac_textSignal,self.pwdTF.rac_textSignal] reduce:^id _Nullable(NSString *account,NSString *pwd){
        
        //block:只要源信号发送内容就会调用，组合成新一个值
        NSLog(@"%@ %@",account,pwd);
        
        return @(account.length&&pwd.length);
    }];
    
    //写法一
    //    [cominesignal subscribeNext:^(id  _Nullable x) {
    //
    //        self.loginBtn.enabled=[x boolValue];
    //    }];
    
    // 宏的写法
    //按钮是否可用。
    RAC(self.loginBtn,enabled)=cominesignal;
    
}
-(IBAction)btnlCick:(id)sender
{
    NSLog(@"按钮点击");
}
#pragma mark - 等所有信号都发送内容的完成的时候才会调用
-(void)zipWith
{
    
    // 压缩成一个信号
    // zipWith:当一个界面多个请求的时候,要等所有请求完成才能更新UI
    // zipWith:等所有信号都发送内容的时候才会调用
    
    RACSubject *subjectA=[RACSubject subject];
    
    RACSubject *subjectB=[RACSubject subject];
    
    //压缩成一个信号
    RACSignal *zipSignal=[subjectA zipWith:subjectB];
    
    //订阅信号
    [zipSignal subscribeNext:^(id  _Nullable x) {
        
        NSLog(@"%@",x);
        
    }];
    
    //发送信号
     [subjectB sendNext:@"22"];
    [subjectA sendNext:@"11"];
   
    
    
}

#pragma mark -任意一个信号请求完成都会订阅到
-(void)merge
{
    RACSubject *subjectA=[RACSubject subject];
    
    RACSubject *subjectB=[RACSubject subject];
    
    //组合信号
    RACSignal *signal=[subjectA merge:subjectB];
    
    
    [signal subscribeNext:^(id  _Nullable x) {
       //任意一个信号发送内容都会来到这个block
        NSLog(@"%@",x);
    }];
    
    //发送数据
   
    [subjectA sendNext:@"请求一"];
    [subjectB sendNext:@"请求二"];
    
    
    
}

#pragma mark -忽略掉第一个信号所有值
-(void)then
{
    
    RACSignal *signalA=[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        
        NSLog(@"信号A");
        [subscriber sendNext:@"A：发送数据 "];
        
        //发送完成  不能少
        [subscriber sendCompleted];
        return nil;
    }];
    
    
    RACSignal *signalB=[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
       
        NSLog(@"信号 B");
        [subscriber sendNext:@"B:发送数据"];
        return nil;
    }];
    
    //创建组合信号
    //then ：忽略掉第一个信号所有值
    RACSignal *thenSignal=[signalA then:^RACSignal * _Nonnull{
       
        //返回信号就是需要组合的信号
        return signalB;
    }];
    
    [thenSignal subscribeNext:^(id  _Nullable x) {
       
        NSLog(@"%@",x);
    }];
    
   // 注意:concat,第一个信号必须要调用sendCompleted .不然第二个信号不执行
    
}

#pragma mark - 按顺序去连接
-(void)concat
{
    
    RACSignal *signalA=[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
       
        NSLog(@"信号A");
        [subscriber sendNext:@"A：发送数据 "];
        
        //发送完成  不能少
        [subscriber sendCompleted];
        
        return nil;
    }];
    
    RACSignal *signalB=[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        
        NSLog(@"信号 B");
        [subscriber sendNext:@"B:发送数据"];
        return nil;
    }] ;
    
    // concat:按顺序去连接
    // 注意:concat,第一个信号必须要调用sendCompleted
    RACSignal *signalConcat=[signalA concat:signalB];
    
    [signalConcat subscribeNext:^(id  _Nullable x) {
        
         // 既能拿到A信号的值,又能拿到B信号的值
        NSLog(@"%@",x);
    }];
    
    
    
}
@end
